READONLYキャッシュ・グループおよびカスタマイズされた一部のUSERMANAGEDキャッシュ・グループは、AUTOREFRESH機能を使用してOracle更新をTimesTenキャッシュに自動的に伝播します。
キャッシュ・グループには、完全自動リフレッシュまたは増分自動リフレッシュのいずれかを設定できます(「AUTOREFRESHキャッシュ・グループ属性」を参照)。増分自動リフレッシュ用に設定した場合、TimesTenでは、キャッシュ・グループで指定された各Oracle実表に対して、トリガー、ログ表などのオブジェクトを作成する必要があります。トリガーは、Oracle実表で挿入、更新および削除処理を行うたびに起動されます。また、更新されたレコードの主キーをログ表に記録します。TimesTenキャッシュ・エージェントは、定期的にログ表で更新キーを検索し、更新されたOracle実表を結合して最新の更新のスナップショットを取得します。
自動リフレッシュに必要なOracleオブジェクトは、AUTOREFRESH INCREMENTALを使用するキャッシュ・グループの作成時にTimesTenによって自動的にインストールされます(「Oracleオブジェクトの自動インストール」を参照)。Oracleオブジェクトをインストールする前に、次のタスクを実行する必要があります。
また、Oracleオブジェクトを手動でインストールして、限定されたOracle権限を持つユーザーがトリガーを使用するキャッシュ・グループを作成できるようにすることもできます(「Oracleオブジェクトの手動インストール」を参照)。
TimesTenは、各キャッシュ管理ユーザーに対して次の表を作成します。ここで、versionは、TimesTenの内部バージョン番号です。
TimesTenは、キャッシュ・グループの各表に対して次のオブジェクトを作成します。ここで、numberは元のOracle表のオブジェクトID、versionはTimesTenの内部バージョン番号です。
TT_version_number_L | Oracle表に対して行われた変更を記録するための変更ログ表。 |
TT_version_number_T | 変更ログ表に変更を記録するためのトリガー。トリガーは、キャッシュされた表で挿入、削除、更新が行われると起動されます。 |
AWTキャッシュ・グループにもOracleオブジェクトが必要です。Oracleでは、状態およびOracleに最後に適用された文を追跡するために、状態表が作成されます。この表は、CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP文によって自動的に作成されます。また、Oracle表は、AWTキャッシュ・グループが作成される前に手動で作成することもできます。「AWTキャッシュ・グループ用のOracleオブジェクトの手動インストール」を参照してください。
TimesTenは、次の表のユーザーPUBLICに対してSELECT、INSERT、UPDATEおよびDELETE権限を付与します。
この項の後半では、次の内容について説明します。
TimesTenで、Oracleオブジェクトを自動的にインストールするようにするには、Oracleオブジェクトの自動作成に必要なすべての権限がキャッシュ管理ユーザーに付与されていることを確認します。「Oracleユーザーの作成および権限の設定」を参照してください。Oracleオブジェクトは、PAUSEDまたはONの状態でキャッシュ・グループが作成されるか、またはキャッシュ・グループの状態がPAUSEDまたはONに変更されると、自動的に作成されます。
例3.29に、TimesTenで、READONLYキャッシュ・グループ用のOracleオブジェクトを自動的にインストールする方法を示します。
> ttIsql cgDSN
Command> call ttCacheUidPwdSet('testuser','mypsswrd');
Command> call ttCacheStart();
Command> CREATE READONLY CACHE GROUP readcache
FROM
user1.readtab
(a NUMBER NOT NULL PRIMARY KEY, b VARCHAR2(31));
例3.30に、TimesTenで、AWTキャッシュ・グループ用のOracleオブジェクトを自動的にインストールする方法を示します。
> ttIsql cgDSN
Command> call ttCacheUidPwdSet('testuser','mypsswrd');
Command> call ttCacheStart();
Command> CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP writecache
FROM user1.writetab (a NUMBER NOT NULL PRIMARY KEY,
b VARCHAR2(31));
Oracleオブジェクトの自動インストールに必要なすべてのCREATE権限をユーザーに付与しない場合は、Oracleオブジェクトを手動でインストールし、AUTOREFRESH INCREMENTALを使用するキャッシュ・グループおよびAWTキャッシュ・グループを限定された権限を持つユーザーが作成できるようにします。詳細は、「AWTキャッシュ・グループ用のOracleオブジェクトの手動インストール」を参照してください。
手動でインストールされたOracleオブジェクトを使用するために必要な権限は、「Oracleユーザーの作成および権限の設定」に示されています。ただし、オブジェクトのインストーラに、自動インストール・オプションを選択したユーザーと同じOracle権限が付与されている必要があります。
Oracleオブジェクトの作成に必要なSQLコードは、TimesTenから取得する必要があります。
cachesqlget
コマンドを入力します。注意: | OracleオブジェクトをインストールするSQLコードの取得時に、オブジェクトを削除するSQLコードを取得するスクリプトを生成する必要もあります(「Oracleオブジェクトの削除」を参照)。このスクリプトは、後で使用するために保存します。 |
SQLコードを取得した後、Oracleのホスト・マシン上でSQL*Plusを起動してログインすることによって、Oracleオブジェクトを手動で作成できます。
sqlplus cacheUid/cachePwd@machine_name
キャッシュ・エージェント・ユーザーがOracleにオブジェクトを作成するために必要なOracle拡張権限の詳細は、「Oracleユーザーの作成および権限の設定」を参照してください。
SQL>
プロンプトで、SQLコードを入力してオブジェクトを作成できます。
ttIsqlを使用してデータ・ストアに接続した後で、ttCacheStartプロシージャをコールしてデータ・ストアのキャッシュ・エージェントを起動します。キャッシュ管理ユーザーIDはtestuser、パスワードはmypsswrdです。次に、CREATE CACHE GROUPを使用してAUTOREFRESH STATEがOFFに設定されたREADONLYキャッシュ・グループを作成し、cachesqlget
コマンドを実行してOracleオブジェクトのインストールに必要なSQLを取得します。
> ttIsql cgDSN
Command> call ttCacheUidPwdSet('testuser', 'mypsswrd');
Command> call ttCacheStart();
Command> CREATE READONLY CACHE GROUP readcache
AUTOREFRESH
MODE INCREMENTAL
INTERVAL 30 SECONDS
STATE OFF
FROM USER1.READTAB
(A NUMBER NOT NULL PRIMARY KEY, B VARCHAR2(31));
Command> cachesqlget readcache install;
cachesqlget
からの出力は次のようになります。
CREATE TABLE system.tt_version_user_count(tableName VARCHAR2(65), userCount
.... more code .....
END;
.
RUN;
SQLは、TimesTenからOracle上のSQL*Plusプロンプトに簡単に切り取って貼り付けることができます。
SQL> CREATE TABLE system.tt_version_user_count(tableName VARCHAR2(65), userCount
.... more code .....
END;
.
RUN;
また、ttIsqlでコマンドラインに出力ファイル名を指定して、cachesqlget
出力をファイルに保存することもできます。その後、そのファイルをOracleシステムにコピーしてOracleシステムで実行すると、Oracleオブジェクトをインストールできます。
キャッシュをロードすると、AUTOREFRESH STATEはPAUSEDからONに変更されます。次のようにCOMMIT EVERY n ROWS句を含めます。
Command> LOAD CACHE GROUP readcache
COMMIT EVERY 1000 ROWS;
注意: | Oracleオブジェクトを手動でインストールした場合は、手動で削除する必要があります。詳細は、「Oracleオブジェクトの削除」を参照してください。 |
AWTキャッシュ・グループ用のOracleオブジェクトを手動でインストールする場合は、Oracleインスタンス用のAWTキャッシュ・グループを作成する前にインストールしておく必要があります。Oracleインスタンスおよびキャッシュ管理ユーザーIDとパスワードそれぞれに対してオブジェクトを一度のみインストールする必要があります。
Oracleオブジェクトをインストールするには、次の手順を実行します。
cgDSN
です。NULL結果は、cgDSN
に設定されているキャッシュ管理ユーザーIDまたはパスワードが存在しないことを示します。> ttIsql cgDSN
Command> call ttCacheUidGet();
< <NULL> >
1 row found.
testuser
、パスワードをmypsswrd
に設定した後、そのように設定されたことを確認しています。Command> call ttCacheUidPwdSet('testuser','mypsswrd');
Command> call ttCacheUidGet();
< testuser >
cachesqlget
コマンドを使用することによって、オブジェクトをインストールするSQLを取得します。Command> cachesqlget ASYNCHRONOUS_WRITETHROUGH INSTALL
出力は次のようになります。
CREATE TABLE testuser.TT_02_RepPeers(
replication_name VARCHAR2(31) NOT NULL,
replication_owner VARCHAR2(31) NOT NULL,
tt_store_id NUMBER NOT NULL,
subscriber_id NUMBER NOT NULL,
commit_timestamp NUMBER,
commit_seqnum NUMBER,
timerecv NUMBER,
protocol NUMBER,
PRIMARY KEY(tt_store_id));
GRANT INSERT, UPDATE, DELETE, SELECT ON testuser.TT_02_RepPeers TO PUBLIC;
注意: | Oracleオブジェクトを手動でインストールした場合は、手動で削除する必要があります。詳細は、「AWTキャッシュ・グループ用のOracleオブジェクトの手動削除」を参照してください。 |
オブジェクトがOracleにインストールされていることを確認するには、OracleアカウントにログインしてOracleのSQL *Plusコマンド・プロンプトから次の問合せを実行します。
SQL> select owner, object_name, object_type from all_objects where object_name like 'TT\___\_%' escape '\';
出力には、次のようなオブジェクトが含まれている必要があります。
OWNER OBJECT_NAME OBJECT_TYPE
------------- ------------------------------ ------------------
TESTUSER TT_02_34520_L TABLE
TESTUSER TT_02_34520_T TRIGGER
TESTUSER TT_02_USER_COUNT TABLE
TESTUSER TT_02_REPPEERS TABLE
OracleオブジェクトがCache Connect to Oracleによって自動的にインストールされた場合(「Oracleオブジェクトの自動インストール」を参照)は、AUTOREFRESHをOFFに設定するか、またはDROP CACHE GROUPを使用してキャッシュ・グループを削除すると、Oracleオブジェクトは自動的に削除されます。
Oracleオブジェクトを手動でインストールした場合(「Oracleオブジェクトの手動インストール」を参照)は、アンインストールするコードを実行することによって、Oracleシステムからオブジェクトを削除できます。TimesTenからuninstallコードを取得するには、次のように入力します。
Oracleインスタンスを使用するすべてのデータ・ストアからすべてのAWTキャッシュ・グループを削除した後で、AWTキャッシュ・グループ用のOracleオブジェクトを削除します。
cachesqlget
コマンドを実行して、オブジェクトを削除するSQLを取得します。次の例では、DSNはcgDSN
、ユーザーはtestuser
です。> ttIsql -connStr "dsn=cgDSN'
Command> cachesqlget ASYNCHRONOUS_WRITETHROUGH UNINSTALL
出力は次のようになります。
DROP TABLE testuser.TT_02_RepPeers;